iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
生成式 AI

「解放自動化新利器!深入了解 n8n 如何助你輕鬆打造專屬工作流程」系列 第 17

Day17:系統升級!讓 n8n 動態讀取 Google Sheets,告別寫死的地址標籤

  • 分享至 

  • xImage
  •  

一、為什麼要用 Google Sheets 當作「外部大腦」?

在軟體開發中,將「經常變動的資料」與「相對固定的處理邏輯」分開,是一個非常重要的設計原則。

  • 資料層 (Data Layer):我們的地址標籤庫,未來可能會頻繁新增交易所、DeFi 協議、或專案方的錢包。這部分應該要易於修改。
  • 邏輯層 (Logic Layer):我們「解析交易 → 比對標籤 → 發送通知」的這套流程,相對固定,不需經常變動。

Google Sheets 正是扮演「資料層」的完美角色。它免費、易用,任何人都可以透過簡單的表格操作,來更新我們系統的「知識庫」,而完全不需要碰 n8n 的工作流。


二、升級後的流程圖:先讀取知識、再處理交易

我們的流程將會進化,在接收到交易後,會先去 Google Sheets 讀取最新的地址標籤庫,然後才進行後續的處理。

本日新工作流

Webhook → Google Sheets (讀取標籤庫) → Code (整合資料與標記) → Switch → **Discord**s...

(示意圖:新的 Google Sheets 節點將串接在 Webhook 之後,成為我們系統的外部知識庫)


三、Day 17 實戰:打造一個可以動態學習的告警系統

步驟 1:準備你的「外部大腦」— 建立 Google Sheets 地址庫

  1. 打開你的 Google Drive,新增一個 Google Sheets 文件,並將其命名為「n8n 鏈上地址標籤庫」。
  2. 在工作表中,建立 3 個欄位,並依照以下格式填入我們的範例資料:
    • A欄 (欄位名稱:Address):錢包或合約地址。
    • B欄 (欄位名稱:Label):我們為這個地址取的易懂名稱。
    • C欄 (欄位名稱:Category):地址的分類,例如 Exchange 或 DeFi
Address Label Category
0x28c6c06298d514db089934071355e5743bf21d60 Binance 14 Exchange
0xf977814e90da44bfa03b6295a0616a897441acec Binance 8 Exchange
0x503828976d22510aad0201ac792873a52524375a Coinbase 10 Exchange
0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45 Uniswap V3 Router DeFi
0x7a250d5630b4cf539739df2c5dacb4c659f2488d Uniswap V2 Router DeFi

https://ithelp.ithome.com.tw/upload/images/20251001/20178736ZfX4FbB5Uw.png

步驟 2:讓 n8n 讀取 Google Sheets

  1. 回到你的 n8n 畫布,在 Webhook 節點之後,新增一個 Google Sheets 節點。
  2. 設定憑證:如果你是第一次使用,請點擊 Credential 欄位,選擇「Create New」,並按照 n8n 的引導,完成 Google 帳號的 OAuth 授權。
  3. 設定操作
    • Resource: 選擇 Sheet
    • Operation: 選擇 Read
    • Spreadsheet ID: 從你的 Google Sheets 網址中,複製那串長長的 ID,貼到這裡。
    • Sheet Name: 輸入你的工作表名稱(預設是 Sheet1)。
    • Range: 保持空白,代表讀取整個工作表。
    • Options: 啟用 Read as Key/Value Pairs,這能讓輸出的資料格式更乾淨。

https://ithelp.ithome.com.tw/upload/images/20251001/20178736J7sNJ3qwqZ.png

步驟 3:升級你的 Code 節點 (整合外部與內部資料)

這是今天最關鍵的一步。我們要改造昨天的 Code 節點,讓它同時處理兩份資料:一份是 Webhook 傳來的交易資料,另一份是 Google Sheets 傳來的標籤庫資料

  1. 刪除舊的 Code 節點。在 Google Sheets 節點後,新增一個新的 Code 節點
  2. 將以下完整程式碼,直接複製並貼上。
// --- 1. 獲取兩個不同來源的資料 ---

// 獲取 Webhook 節點 (觸發點) 的資料
const webhookData = $getExecution().trigger.json;
// 獲取上一個節點 (Google Sheets) 的資料
const addressBookItems = $input.all();

// --- 2. 建立「動態」的地址標籤庫 ---

// 建立一個空的地址字典
const knownAddresses = {};
// 遍歷從 Google Sheets 讀取到的每一行資料
for (const item of addressBookItems) {
  // 將地址轉換為小寫,作為字典的 key
  const address = item.json.Address.toLowerCase();
  // 將標籤作為字典的 value
  const label = item.json.Label;
  // 存入字典
  knownAddresses[address] = label;
}

// --- 3. 解析交易資料,並用「動態標籤庫」進行比對 ---

const activity = webhookData.event?.activity?.[0] || {};
const tx = {
  from: activity.fromAddress || '未知地址',
  to: activity.toAddress || '未知地址',
  value: parseFloat(activity.value) || 0,
  asset: activity.asset || '未知代幣',
  hash: activity.hash || 'N/A',
};

// 準備一個新的 JSON 物件來存放加工後的資料
const outputJson = { ...webhookData };

// 使用我們動態建立的標籤庫來賦予標籤
outputJson.fromTag = knownAddresses[tx.from.toLowerCase()] || "未知錢包";
outputJson.toTag = knownAddresses[tx.to.toLowerCase()] || "未知錢包";
outputJson.tx = tx;

// 建立一個新的 n8n 資料項來回傳
const newItem = { json: outputJson };

// 最後,回傳這個全新的資料項,給後續的 Switch 節點使用
return newItem;

  • 它同時從兩個地方拿資料:$getExecution().trigger.json 用來拿最源頭的 Webhook 資料,$input.all() 用來拿上一層 Google Sheets 的資料。
  • 它先用一個 for 迴圈,將 Google Sheets 的多行資料,動態地轉換成我們需要的「地址字典」物件。
  • 之後的比對邏輯與昨天完全相同,但它現在使用的是這個「動態」的字典!

步驟 4:確認後續節點不需變動

最棒的是:我們昨天設定的 Switch 節點和多個 Discord 節點,完全不需要做任何修改!因為它們本來就是依賴 fromTag 和 toTag 這兩個欄位來運作的,而我們剛剛的新 Code 節點,依然忠實地產生了這兩個欄位。

這就是「關注點分離」設計原則的威力!


四、結論:你的系統學會了「動態學習」

恭喜!今天你完成了一次架構上的巨大飛躍。你的告警系統不再是一個寫死的機器,而是一個可以透過外部 Google Sheets 動態更新知識的智慧系統。

現在,任何團隊成員,只要在那個 Google Sheets 文件中新增一行,例如加入一個新的駭客地址並標記為「Hacker」,你的 n8n 系統就會在下一次執行時,自動學會辨識這個新地址,完全不需要你再動一行程式碼。


上一篇
Day 16|用 n8n 內建邏輯打造看得懂人話的「進階版」巨鯨告警
下一篇
Day 18 :讓監控更精準!用 IF 節點實現「特定代幣」過濾告警
系列文
「解放自動化新利器!深入了解 n8n 如何助你輕鬆打造專屬工作流程」20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言